/*
 * Copyright (c) NEXTCHIP Inc. 2017-2020. All rights reserved.
 * Description: NEXTCHIP driver
 * Author: NEXTCHIP Inc.
 * Create: 2020/03/20
 * Modification: 2020/06/20, Hisilicon.
 */

#ifndef _RAPTOR3_VIDEO_AUTO_DETECT_H_
#define _RAPTOR3_VIDEO_AUTO_DETECT_H_

#include "common.h"

typedef enum CH_NUM {
    CH1 = 0,
    CH2,
    CH3,
    CH4
} CH_NUM;

typedef struct _video_input_vafe {
    unsigned char powerdown; // B0       0x00/1/2/3 [0]
    unsigned char gain;      // B0       0x00/1/2/3 [4]
    unsigned char spd;       // B5/6/7/8 0x00       [5:4]

    unsigned char ctrlreg;  // B5/6/7/8 0x01       [6]
    unsigned char ctrlibs;  // B5/6/7/8 0x01       [5:4]
    unsigned char adcspd;   // B5/6/7/8 0x01       [2]
    unsigned char clplevel; // B5/6/7/8 0x01       [1:0]

    unsigned char eq_band;        // B5/6/7/8 0x58       [6:4]
    unsigned char lpf_front_band; // B5/6/7/8 0x58       [1:0]

    unsigned char clpmode;      // B5/6/7/8 0x59       [7]
    unsigned char f_lpf_bypass; // B5/6/7/8 0x59       [4]
    unsigned char clproff;      // B5/6/7/8 0x59       [3]
    unsigned char b_lpf_bypass; // B5/6/7/8 0x59       [0]

    unsigned char duty;    // B5/6/7/8 0x5B    	  [6:4]
    unsigned char ref_vol; // B5/6/7/8 0x5B       [1:0]

    unsigned char lpf_back_band; // B5/6/7/8 0x5C       [6:4]
    unsigned char clk_sel;       // B5/6/7/8 0x5C       [3]
    unsigned char eq_gainsel;    // B5/6/7/8 0x5C       [2:0]
} video_input_vafe;

typedef struct _video_input_auto_detect {
    unsigned char ch;
    unsigned char devnum;

    unsigned char d_cmp;          // B5/6/7/8 0x03
    unsigned char slice_level;    // B5/6/7/8 0x08
    unsigned char control_mode;   // B5/6/7/8 0x47
    unsigned char gdf_fix_coeff;  // B5/6/7/8 0x50
    unsigned char dfe_ref_sel;    // B5/6/7/8 0x76
    unsigned char wpd_77;         // B5/6/7/8 0x77
    unsigned char wpd_78;         // B5/6/7/8 0x78
    unsigned char wpd_79;         // B5/6/7/8 0x79
    unsigned char auto_gnos_mode; // B5/6/7/8 0x82
    unsigned char auto_sync_mode; // B5/6/7/8 0x83
    unsigned char hafc_bypass;    // B5/6/7/8 0xB8

    unsigned char novid_vfc_init; // B13		0x31
    unsigned char stable_mode_1;  // B13		0x0
    unsigned char stable_mode_2;  // B13		0x1

    unsigned char novid_det; // B0		0x23/0x27/0x2B/0x2F
    video_input_vafe vafe;
} video_input_auto_detect;

typedef struct _video_input_novid {
    unsigned char ch;
    unsigned char novid; // B0 0xa8 [3:0]  MSB 1Ch ~ LSB 4Ch
    unsigned char devnum;
} video_input_novid;

typedef struct _video_input_vfc {
    unsigned char ch;
    unsigned char vfc; // B5/6/7/8 0xf0
    unsigned char devnum;
} video_input_vfc;

typedef struct _video_input_onvid_set {
    unsigned char ch;
    unsigned char auto_gnos_mode; // B5/6/7/8 0x82
    unsigned char auto_sync_mode; // B5/6/7/8 0x83
    unsigned char op_md;          // B5/6/7/8 0xB8
} video_input_onvid_set;

typedef struct _video_input_onvid_set_2 {
    unsigned char ch;
    unsigned char dfe_ref_sel; // B5/6/7/8 0x76
    unsigned char wpd_77;      // B5/6/7/8 0x77
    unsigned char wpd_78;      // B5/6/7/8 0x78
    unsigned char wpd_79;      // B5/6/7/8 0x79
    unsigned char slice_mode;  // B5/6/7/8 0x0E
} video_input_onvid_set_2;

typedef struct _video_input_novid_set {
    unsigned char ch;
    unsigned char devnum;
    unsigned char control_mode;
    unsigned char gdf_fix_coeff;
    unsigned char auto_gnos_mode;
    unsigned char auto_sync_mode;
    unsigned char hafc_bypass;
    unsigned char dfe_ref_sel; // B5/6/7/8 0x76
    unsigned char wpd_77;      // B5/6/7/8 0x77
    unsigned char wpd_78;      // B5/6/7/8 0x78
    unsigned char wpd_79;      // B5/6/7/8 0x79
    unsigned char slice_mode;  // B5/6/7/8 0x0E
} video_input_novid_set;

typedef struct _video_input_cable_dist {
    unsigned char ch;
    unsigned char devnum;
    unsigned char dist; // B13 0xA0
    unsigned char FmtDef;
    unsigned char cabletype; // 0:coax, 1:utp, 2:reserved1, 3:reserved2
} video_input_cable_dist;

typedef struct _video_input_sam_val {
    unsigned char ch;
    unsigned char devnum;
    unsigned int sam_val;
} video_input_sam_val;

typedef struct _video_input_hsync_accum {
    unsigned char ch;
    unsigned char devnum;
    unsigned char h_lock;            // Bank 0 0xE2 [3:0] [Ch3:Ch0]
    unsigned int hsync_accum_val1;   // Value 1  			// 170210 Add
    unsigned int hsync_accum_val2;   // Value 2				// 170210 Add
    unsigned int hsync_accum_result; // Value 1 - Value 2	// 170210 Fix
} video_input_hsync_accum;

typedef struct _video_input_agc_val {
    unsigned char ch;
    unsigned char devnum;
    unsigned char agc_lock;
    unsigned char agc_val; // B13 0xB8
} video_input_agc_val;

typedef struct _video_input_format_set_done { // [add] 170209 format set done
    unsigned char ch;
    unsigned char set_val; // B13 0x70 [3:0] each channel
} video_input_format_set_done;

typedef struct _video_input_fsc_val {
    unsigned char ch;
    unsigned char devnum;
    unsigned int fsc_val1;
    unsigned int fsc_val2;
    unsigned int fsc_final;
} video_input_fsc_val;

typedef struct _video_input_aeq_set { // 170214 AEQ Set
    unsigned char ch;
    unsigned char aeq_val; // B5/6/7/8 0x58       [7:4]
} video_input_aeq_set;

typedef struct _video_input_deq_set { // 170214 DEQ Set
    unsigned char ch;
    unsigned char deq_val; // B9 0x80/0xA0/0xC0/0xE0 [3:0]
} video_input_deq_set;

typedef struct _video_input_vfc_set { // 170215 VFC Setting Enable  (temp)
    unsigned char ch;
    unsigned char set_val;
} video_input_vfc_set;


typedef struct _video_input_acc_gain_val { // 170215 acc gain value read
    unsigned char ch;
    unsigned char devnum;
    unsigned int acc_gain_val;
    unsigned char func_sel;
} video_input_acc_gain_val;

typedef struct _video_input_sleep_time_val { // 170215 acc gain value read
    unsigned char sleep_val;
} video_input_sleep_time_val;

typedef struct _video_input_agc_reset_val { // 170221 agc init
    unsigned char ch;
    unsigned char reset_val;
} video_input_agc_reset_val;

typedef struct _video_output_data_out_mode {
    unsigned char ch;
    unsigned char devnum;
    unsigned char set_val;
} video_output_data_out_mode;

typedef struct _video_input_manual_mode {
    unsigned char ch;
    unsigned char dev_num;
} video_input_manual_mode;

typedef struct _video_input_onvideo_check_s {
    unsigned char vfc;
    unsigned char sw_rst_ret;
    decoder_dev_ch_info_s info;
} video_input_onvideo_check_s;


void video_input_auto_detect_set(video_input_auto_detect *vin_auto_det);
void video_input_vfc_read(video_input_vfc *vin_vfc);
void video_input_novid_read(video_input_novid *vin_novid);                         // 170204 novid
void video_input_no_video_set(video_input_novid *auto_novid);                      // 170206 novideo set
void video_input_cable_dist_read(video_input_cable_dist *vin_cable_dist);          // 170207 Cable Distance
void video_input_sam_val_read(video_input_sam_val *vin_sam_val);                   // 170207 SAM Value
void video_input_hsync_accum_read(video_input_hsync_accum *vin_hsync_accum);       // 170207 Hsync Accumulation
void video_input_agc_val_read(video_input_agc_val *vin_agc_val);                   // 170207 AGC Value
void video_input_fsc_val_read(video_input_fsc_val *vin_fsc_val);                   // 170214 fsc value read
void video_input_aeq_val_set(const video_input_aeq_set *vin_aeq_val);                    // 170214 aeq value set
void video_input_deq_val_set(const video_input_deq_set *vin_deq_val);                    // 170214 deq value set
void video_input_acc_gain_val_read(video_input_acc_gain_val *vin_acc_gain);        // 170215 acc gain value read
void video_output_data_out_mode_set(video_output_data_out_mode *vo_data_out_mode); // 170329 Data Out Mode Setting Func
void video_input_manual_mode_set(video_input_manual_mode *vin_manual_det);         // 170330 Manual Mode Set
void video_input_onvideo_set(decoder_dev_ch_info_s *decoder_info);

void video_input_onvideo_check_data(video_input_vfc *vin_vfc);
void video_input_auto_ch_sw_rst(decoder_dev_ch_info_s *decoder_info);

int video_input_cable_measure_way(unsigned char ch, unsigned char devnum);
void video_input_vafe_reset(decoder_dev_ch_info_s *decoder_info);
void video_input_vafe_control(decoder_dev_ch_info_s *decoder_info, int cmd);
void video_input_manual_agc_stable_endi(decoder_dev_ch_info_s *decoder_info, int endi);
void video_input_ahd_tvi_distinguish(decoder_dev_ch_info_s *decoder_info);
void video_input_cvi_tvi_distinguish(decoder_dev_ch_info_s *decoder_info);
void video_input_cvi_ahd_1080p_distinguish(decoder_dev_ch_info_s *decoder_info);
void video_input_ahd_nrt_distinguish(decoder_dev_ch_info_s *decoder_info);
unsigned char __IsOver3MRTVideoFormat(decoder_dev_ch_info_s *decoder_info);
NC_VIVO_CH_FORMATDEF NC_VD_AUTO_VFCtoFMTDEF(unsigned char ch, unsigned char VFC);
void nvp6168_video_input_hsync_accum_read(video_input_hsync_accum *vin_hsync_accum);
void nvp6168_video_input_onvideo_set(decoder_dev_ch_info_s *decoder_info);
void nvp6168_video_input_vfc_read(video_input_vfc *vin_vfc);
void nvp6168_video_input_auto_detect_set(video_input_auto_detect *vin_auto_det);
void nvp6168_video_input_no_video_set(video_input_novid *auto_novid);
void nvp6168_video_input_cvi_tvi_5M20p_distinguish(decoder_dev_ch_info_s *decoder_info);


#endif /* _RAPTOR3_VIDEO_AUTO_DETECT_H_ */
